package ar.edu.utn.frre.sistop.simumem.common;

import java.lang.reflect.Type;
import java.util.ArrayList;

import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import ar.edu.utn.frre.sistop.simumem.model.Particion;
import ar.edu.utn.frre.sistop.simumem.model.Proceso;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

public class Preferences {

	private Context mContext;
	private SharedPreferences mSharedPreferences;
	private static final String APP_PREFERENCES = "simumemPreferences";
	private static final String ALGORITMO = "algoritmoAsignacion";
	private static final String TAMANO = "tamanoMemoria";
	private static final String COMPACTAR = "compactarMemoria";
	private static final String PARTICIONES_VARIABLES = "particionesVariables";
	private static final String PROCESOS = "procesos";
	private static final String PARTICIONES = "particiones";

	public Preferences(Context context) {
		this.mContext = context;
		this.mSharedPreferences = this.mContext.getSharedPreferences(APP_PREFERENCES,
				Context.MODE_PRIVATE);
	}

	public int getAlgoritmoAsignacion() {
		return mSharedPreferences.getInt(ALGORITMO, 0);
	}

	public int getTamanoMemoria() {
		return mSharedPreferences.getInt(TAMANO, 0);
	}

	public boolean getCompactarMemoria() {
		return mSharedPreferences.getBoolean(COMPACTAR, false);
	}

	public boolean getTipoParticiones() {
		return mSharedPreferences.getBoolean(PARTICIONES_VARIABLES, false);
	}

	public ArrayList<Proceso> getProcesos() {
		String json = mSharedPreferences.getString(PROCESOS, "");
		Type type = new TypeToken<ArrayList<Proceso>>() {
		}.getType();
		ArrayList<Proceso> procesos = new Gson().fromJson(json, type);
		if (procesos == null) {
			return new ArrayList<Proceso>();
		} else {
			return procesos;
		}
	}

	public ArrayList<Particion> getParticiones() {
		String json = mSharedPreferences.getString(PARTICIONES, "");
		Type type = new TypeToken<ArrayList<Particion>>(){
		}.getType();
		ArrayList<Particion> particiones = new Gson().fromJson(json, type);
		if (particiones == null) {
			return new ArrayList<Particion>();
		} else {
			return particiones;
		}
	}

	public void setAlgoritmoAsignacion(int algoritmo) {
		Editor editor = this.mSharedPreferences.edit();
		editor.putInt(ALGORITMO, algoritmo);
		editor.commit();
	}

	public void setTamanoMemoria(int tamano) {
		Editor editor = this.mSharedPreferences.edit();
		editor.putInt(TAMANO, tamano);
		editor.commit();
	}

	public void setCompactarMemoria(boolean compactar) {
		Editor editor = this.mSharedPreferences.edit();
		editor.putBoolean(COMPACTAR, compactar);
		editor.commit();
	}

	public void setTipoParticiones(boolean tipo) {
		Editor editor = this.mSharedPreferences.edit();
		editor.putBoolean(PARTICIONES_VARIABLES, tipo);
		editor.commit();
	}

	public void setProcesos(ArrayList<Proceso> procesos) {
		Editor editor = this.mSharedPreferences.edit();
		String json = new Gson().toJson(procesos);
		editor.putString(PROCESOS, json);
		editor.commit();
	}
	
	public void setParticiones(ArrayList<Particion> particiones) {
		Editor editor = this.mSharedPreferences.edit();
		String json = new Gson().toJson(particiones);
		editor.putString(PARTICIONES, json);
		editor.commit();
	}
}